package com.example.demo.service;

import com.example.demo.dto.Admin.*;
import com.example.demo.entity.Admin;
import com.example.demo.entity.Bookkeeping;                     // <--- 新增导入
import com.example.demo.entity.User;                            // <--- 新增导入


import java.util.List;
import java.util.Optional;

/**
 * 管理员服务接口，定义管理员相关的业务操作。
 */
public interface AdminService {

    /**
     * 根据账号查找管理员。
     *
     * @param account 管理员账号
     * @return 包含管理员实体的 Optional，如果未找到则为空
     */
    Optional<Admin> getAdminByAccount(String account);

    /**
     * 创建新的管理员账户。
     *
     * @param requestDto 包含新管理员信息的 DTO
     * @return 创建成功后的 Admin 实体
     * @throws IllegalArgumentException 如果账号已存在或请求数据无效
     */
    Admin createAdmin(AdminCreationRequestDto requestDto);

    /**
     * 获取所有管理员的信息列表。
     *
     * @return 管理员实体列表
     */
    List<Admin> getAllAdmins();

    /**
     * 更新当前登录管理员自己的个人信息（账号、用户名、密码）。
     *
     * @param currentAdminAccount 当前认证的管理员账号
     * @param updateDto 包含要更新的信息的 DTO
     * @return 更新后的 Admin 实体
     * @throws IllegalArgumentException 如果新账号已被占用，或发生其他验证错误
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException 如果当前认证的管理员未在数据库中找到
     */
    Admin updateOwnAdminProfile(String currentAdminAccount, AdminSelfUpdateDto updateDto);

    /**
     * 删除当前登录管理员自己的账户。
     *
     * @param currentAdminAccount 当前认证的管理员账号
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException 如果当前认证的管理员未在数据库中找到
     * @throws IllegalStateException 如果尝试删除最后一个管理员（可选业务规则，当前实现未强制）
     */
    void deleteOwnAdminAccount(String currentAdminAccount);

    // --- 新增用户管理接口 ---

    /**
     * 管理员添加新用户。
     *
     * @param creationRequestDto 用户创建信息 DTO
     * @return 创建的用户实体
     * @throws IllegalArgumentException 如果用户账号已存在或数据无效
     */
    User adminAddUser(AdminUserCreationRequestDto creationRequestDto);

    /**
     * 管理员删除指定账号的用户。
     *
     * @param userAccount 要删除的用户账号
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException 如果用户未找到
     */
    void adminDeleteUser(String userAccount);

    /**
     * 管理员修改指定账号的用户信息（包括密码）。
     *
     * @param userAccount 要修改的用户账号
     * @param updateDto   用户更新信息 DTO
     * @return 更新后的用户实体
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException 如果用户未找到
     * @throws IllegalArgumentException 如果新账号已被其他用户占用或数据无效
     */
    User adminUpdateUser(String userAccount, AdminUserUpdateRequestDto updateDto);

    /**
     * 管理员查询指定用户的账本数据。
     *
     * @param userAccount 用户账号
     * @return 用户的账本记录列表
     * @throws org.springframework.security.core.userdetails.UsernameNotFoundException 如果用户未找到
     */
    List<Bookkeeping> adminGetUserBookkeepingRecords(String userAccount);
    /**
     * 管理员为指定用户添加账本记录。
     *
     * @param userAccount 目标用户的账号
     * @param recordDto   账本记录创建信息 DTO
     * @return 创建的账本实体
     * @throws jakarta.persistence.EntityNotFoundException 如果用户未找到
     * @throws IllegalArgumentException 如果请求数据无效
     */
    Bookkeeping adminAddUserBookkeepingRecord(String userAccount, AdminBookkeepingCreationRequestDto recordDto);

    /**
     * 管理员删除指定用户的指定账本记录。
     *
     * @param userAccount 目标用户的账号
     * @param recordId    要删除的账本记录ID
     * @throws jakarta.persistence.EntityNotFoundException 如果用户或账本记录未找到
     * @throws SecurityException 如果账本记录不属于指定用户 (由 BookkeepingService 抛出)
     */
    void adminDeleteUserBookkeepingRecord(String userAccount, Integer recordId);

    /**
     * 管理员修改指定用户的指定账本记录。
     *
     * @param userAccount 目标用户的账号
     * @param recordId    要修改的账本记录ID
     * @param updateDto   账本记录更新信息 DTO
     * @return 更新后的账本实体
     * @throws jakarta.persistence.EntityNotFoundException 如果用户或账本记录未找到
     * @throws SecurityException 如果账本记录不属于指定用户 (由 BookkeepingService 抛出)
     * @throws IllegalArgumentException 如果请求数据无效
     */
    Bookkeeping adminUpdateUserBookkeepingRecord(String userAccount, Integer recordId, AdminBookkeepingUpdateRequestDto updateDto);
}
